home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / geom / mathlabels.orig < prev    next >
Text File  |  1993-01-11  |  3KB  |  136 lines

  1. #!/usr/local/bin/perl
  2. #
  3. # This is mathlabels, Copyright 1992 Silvio Levy
  4. # $Header: /a/tampa/h/tampa_a/fac/levy/texts/geombook/RCS/mathlabels,v 1.1 92/07/17 13:27:40 levy Exp $
  5. #
  6.  
  7. #
  8. # first argument: file name for labels
  9. # second to fifth arguments: xlo, xhi, ylo, yhi (to fix the aspect ratio)
  10. #   use OK for these arguments if no changes need to be made
  11. #
  12.  
  13. die "$0 expects 5 arguments\n"
  14.   if ($#ARGV != 4);
  15.  
  16. $filename=$ARGV[0]; shift;
  17. $xlo=$ARGV[0]; shift;
  18. $xhi=$ARGV[0]; shift;
  19. $ylo=$ARGV[0]; shift;
  20. $yhi=$ARGV[0]; shift;
  21.  
  22. die "Can't open $filename" unless open(labels,">$filename");
  23.  
  24. #
  25. # get various parameters output by psfix
  26. #
  27. while (<>) {
  28.   print;
  29.   last if (/MathPictureStart/);
  30.   ($trash,$lmarg)=split(' ') if (/\/Mlmarg/);
  31.   ($trash,$rmarg)=split(' ') if (/\/Mrmarg/);
  32.   ($trash,$bmarg)=split(' ') if (/\/Mbmarg/);
  33.   ($trash,$tmarg)=split(' ') if (/\/Mtmarg/);
  34.   ($trash,$width)=split(' '), $width*=72 if (/\/Mwidth/);
  35.   ($trash,$height)=split(' '), $height*=72 if (/\/Mheight/);
  36.   ($trash,$nodistort)=split(' ') if (/\/Mnodistort/);
  37. }
  38.  
  39. &doit(0,0,$width,$height);
  40.  
  41. sub doit {
  42. local($XLO,$YLO,$XHI,$YHI)=@_;   # target bounding box
  43. local($Ax,$Bx,$Ay,$By);
  44.  
  45. line:
  46. while (<>) {
  47.  
  48. return if (/^MathSubEnd/);
  49. if (/ MathSubStart/) {
  50.    ($Xlo,$Ylo,$Xhi,$Yhi) = split(' '); 
  51.    print;
  52.    &doit($Xlo*$Ax+$Bx,$Ylo*$Ay+$By,$Xhi*$Ax+$Bx,$Yhi*$Ay+$By);
  53. }
  54.  
  55. #
  56. # look between the lines
  57. #
  58. # % Scaling calculations
  59. # ...                   [
  60. # ] MathScale
  61. #
  62. # to mimic the action of MathScale
  63. #
  64.   if (/% Scaling calculations/) {
  65.     $collecting=1;
  66.     $npts=-2;
  67.   }
  68.   if ($collecting) {  #[
  69.     if (/] MathScale/) {
  70. #
  71. # do the calculations
  72. #
  73.       $collecting=0;
  74.       $i=0;
  75.       while ($i<$npts-2) {
  76.         print($point[$npts]);
  77.       }
  78.       ($trash,$gxlow,$gylow) = split(' ',$point[$npts-2]);
  79.       $gxlow=$xlo unless ($xlo=~/OK/);
  80.       $gylow=$ylo unless ($ylo=~/OK/);
  81.       print("[ $gxlow $gylow 0 0 ]\n");
  82.       ($trash,$gxhigh,$gyhigh) = split(' ',$point[$npts-1]);
  83.       $gxhigh=$xhi unless ($xhi=~/OK/);
  84.       $gyhigh=$yhi unless ($yhi=~/OK/);
  85.       print("[ $gxhigh $gyhigh 0 0 ]\n");
  86.       ($Ax,$Ay,$Bx,$By) = 
  87.            &findpars($XLO,$YLO,$XHI,$YHI,$gxlow,$gylow,$gxhigh,$gyhigh);
  88.       print;
  89.     } else {
  90. #
  91. # put scaling lines into an array
  92. #
  93.       if ($npts>=0) {
  94.         if (!/Msboxa/) {
  95.           $point[$npts] = $_;
  96.           $npts++;
  97.         }
  98.       } else {
  99.         print;
  100.         $npts++;
  101.       }
  102.     }
  103.     next line;
  104.   }
  105. #
  106. # issue labeling command
  107. #
  108.   if (/\[\((.*)\)\]  *([^ ]*)  *([^ ]*)  *([^ ]*)  *([^ ]*)  *Mshowa/) {
  109.     $_=$1;
  110.     $xpos=$2*$Ax+$Bx;
  111.     $ypos=$3*$Ay+$By;
  112.     $xrelpos=$4;
  113.     $yrelpos=$5;
  114.     s/\\([\\()])/$1/g;
  115.     printf labels ("\\setlabel{%s}{%f}{%f}{%f}{%f}\n",
  116.          $_,$xpos,$ypos,$xrelpos,$yrelpos);
  117.     next line;
  118.   }
  119.   print;
  120. }
  121. }
  122.  
  123. sub findpars {
  124.    local($xlow,$ylow,$xhigh,$yhigh,$gxlow,$gylow,$gxhigh,$gyhigh)=@_;
  125.    local ($Ax,$Ay,$Bx,$By);
  126.       $Ax=($xhigh-$xlow)/($gxhigh-$gxlow);
  127.       $Ay=($yhigh-$ylow)/($gyhigh-$gylow);
  128.       if ($nodistort=~/true/) {
  129.         $Ax=$Ay if ($Ax>$Ay);
  130.         $Ay=$Ax if ($Ay>$Ax);
  131.       }
  132.       $Bx=(($xlow+$xhigh)-($gxlow+$gxhigh)*$Ax)/2;
  133.       $By=(($ylow+$yhigh)-($gylow+$gyhigh)*$Ay)/2;
  134.   return($Ax,$Ay,$Bx,$By);
  135. }
  136.